//INS
module ins_mod(
	clk,
	rst,

	ins_en_i,
	c_int_i,
	c_ins_i,
	s_ins_i,

	PC_i,
	mem_data_i,

	PC_o,
	mem_data_o,

	id_en_o,
	do_en_o
);

input clk;
input rst;
input [31:0] PC_i;
input [31:0] mem_data_i;
input ins_en_i;
input c_ins_i;
input [2:0] s_ins_i;
input c_int_i;
output reg [31:0] PC_o;
output reg [31:0] mem_data_o;
output reg id_en_o;
output reg do_en_o;

always @ (posedge clk or posedge rst) begin
	if(rst == 1'b1) begin
		PC_o <= 32'h0;
		mem_data_o <= 32'h0;
		id_en_o <= 1'b0;
		do_en_o <= 1'b0;
	end else if (s_ins_i[1] == 1'b1) begin
		if (s_ins_i[2] == 1'b1) begin
			PC_o <= PC_o;
			mem_data_o <= mem_data_o;
			id_en_o <= id_en_o;
			do_en_o <= do_en_o;		
		end else begin
			PC_o <= PC_o;
			mem_data_o <= mem_data_o;
			id_en_o <= id_en_o;
			do_en_o <= 1'b0;	
		end
	end else if(ins_en_i == 1'b1) begin
		if (c_ins_i == 1'b1) begin
			PC_o <= 32'h0;
			mem_data_o <= 32'h0;
			id_en_o <= 1'b0;
			do_en_o <= 1'b0;
		end else if (c_int_i == 1'b1) begin
			PC_o <= 32'h0;
			mem_data_o <= 32'h0;
			id_en_o <= 1'b0;
			do_en_o <= 1'b0;
		end else begin
			PC_o <= PC_i;
			mem_data_o <= mem_data_i;
			id_en_o <= 1'b1;
			do_en_o <= 1'b1;
		end
	end else begin
		PC_o <= 32'h0;
		mem_data_o <= 32'h0;
		id_en_o <= 1'b0;
		do_en_o <= 1'b0;
	 end
end
endmodule
